#include "TMedio.h"

int Medio_Crear(TMedio* medio) {
	/*medio = (TMedio*) malloc(sizeof(TMedio));*/

	/*if (medio) {*/
		medio->cantidad_placas_conectadas = 0;
		if (MEDIO_DEBUG) printf("Medio_Crear: medio->cantidad_placas_conectadas = %d\n", medio->cantidad_placas_conectadas);
		return MEDIO_OK;
	/*}
	else
		return MEDIO_ERR_MEMORIA;*/
}

int Medio_Destruir(TMedio* medio) {
	int i;
	for (i = 0; i < medio->cantidad_placas_conectadas; i++) {
	    Placa_Destruir(medio->placas_conectadas[i]);
	}
	return MEDIO_OK;
}

size_t Medio_ContarConectadas(TMedio* medio) {
    /*if (MEDIO_DEBUG) printf("Medio_ContarConectadas: medio->cantidad_placas_conectadas = %d\n", (size_t) medio->cantidad_placas_conectadas);*/
	return (size_t)medio->cantidad_placas_conectadas;
}

int Medio_Transmitir (TMedio* medio, void* mensaje, size_t tam) {
    int i;
	for (i = 0; i < medio->cantidad_placas_conectadas; i++)
        if (Placa_Recibir(medio->placas_conectadas[i], mensaje, tam))
          /*REVISAR EL PROBLEMA CON LAS MEMORIAS*/
            return MEDIO_OK
        else
            return MEDIO_ERR_TRANSMITIR;
   
   return MEDIO_OK;
}

int Medio_Conectar (TMedio* medio, TPlaca* placa) {
    int i;

    if (MEDIO_DEBUG) printf("Medio_Conectar: placa = %d\n", placa);
    if (medio->cantidad_placas_conectadas > 0){
	for (i = 0; i == medio->cantidad_placas_conectadas; i++)
		if (Placa_GetDireccion(medio->placas_conectadas[i]) == Placa_GetDireccion(placa))
			return MEDIO_ERR_PLACA_CONECTADA;
    }
    /*Si la funcion no retorna, es porque no existe otra placa con misma direccion a la nueva*/
    if (MEDIO_DEBUG) printf("Medio_Conectar: medio->cantidad_placas_conectadas = %d\n", medio->cantidad_placas_conectadas);
    medio->placas_conectadas[medio->cantidad_placas_conectadas] = placa;
    if (MEDIO_DEBUG) printf("Medio_Conectar: medio->placas_conectadas[%d] == %d\n", medio->cantidad_placas_conectadas, placa);
    (medio->cantidad_placas_conectadas)++;
    if (MEDIO_DEBUG) printf("Medio_Conectar: medio->cantidad_placas_conectadas = %d\n", medio->cantidad_placas_conectadas);
    return MEDIO_OK;
}

int Medio_Desconectar (TMedio* medio, TPlaca* placa) {
    int a, b, i;
	a = 0;
	b = 1;
	while ((a < medio->cantidad_placas_conectadas) && b) {
		if (Placa_GetDireccion(medio->placas_conectadas[a]) == Placa_GetDireccion(placa)) {
		    Placa_Destruir(medio->placas_conectadas[a]);
            for (i = a; i < medio->cantidad_placas_conectadas; i++) {
                medio->placas_conectadas[i] = medio->placas_conectadas[i + 1];
                medio->cantidad_placas_conectadas--;
                b = 0;
            }
        }
        a++;
	}
    if (b) {
        /*Entra si no fue encontrada la placa*/
        if (Placa_GetDireccion(medio->placas_conectadas[a]) == Placa_GetDireccion(placa)) {
            medio->placas_conectadas[a] = NULL;
            Placa_Destruir(medio->placas_conectadas[a]);
            medio->cantidad_placas_conectadas--;
            b = 0;
            return MEDIO_OK;
        }
        else
            return MEDIO_ERR_PLACA_CONECTADA; /*Si no la encontró, retorna ERROR*/
    }
    else {
		Placa_Destruir(medio->placas_conectadas[a]);
		return MEDIO_OK; /*Si la encontro, retorna OK*/
    }
}
